﻿#include "exampaper.h"
#include "question/question.h"
#include "questionfactory.h"

#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonDocument>
#include <QFile>

ExamPaper::ExamPaper(QObject *parent)
    : QObject{parent}
{}


ExamPaper::~ExamPaper()
{
    clearQuestions();
}



bool ExamPaper::fromJson(const QJsonObject &json)
{
    clearQuestions();

    // 解析试卷基本信息
    m_title = json.value("title").toString();
    m_studentName = json.value("studentName").toString();
    m_studentCode = json.value("studentCode").toString();

    // 解析模块列表
    QJsonArray moduleArray = json.value("moduleList").toArray();
    int questionCount = 0;

    for(const QJsonValue &moduleValue:moduleArray)
    {
        QJsonObject moduleObj = moduleValue.toObject();
        // 解析题目组 groupList
        QJsonArray groupArray = moduleObj.value("groupList").toArray();
        for(const QJsonValue &groupValue:groupArray)
        {
            QJsonObject groupObj = groupValue.toObject();

            //解析题型标题？
            m_groupTitle =groupObj.value("title").toString();

            // 解析题目 --- questionList
            QJsonArray questionArray = groupObj.value("questionList").toArray();
            for (const QJsonValue &questionValue : questionArray)
            {
                QJsonObject questionObj = questionValue.toObject();
                //使用工厂模式 创建题目对象
                Question *question = QuestionFactory::createQuestion(questionObj, this);
                if (question) {
                    // 连接答案变更信号
                    connect(question, &Question::answerChanged,
                            this, &ExamPaper::answersChanged);
                    
                    // 添加到总题目列表
                    m_questions.append(question);
                    
                    // 根据题型ID添加到对应的列表
                    if (question->typeId() == Question::TYPE_SINGLE_CHOICE) {
                        m_singleChoiceQuestions.append(question);
                    } else if (question->typeId() == Question::TYPE_JUDGE) {
                        m_judgeQuestions.append(question);
                    }
                    
                    //qDebug() << "Question ID:" << question->id() << "Type ID:" << question->typeId() << "Type String:" << question->typeString();
                    
                    questionCount++;
                }
            }
        }
    }
    // 检查是否成功加载了题目
    if (questionCount == 0) {
        qWarning() << u8"未能加载任何题目";
        return false;
    }

    qDebug() << u8"成功加载试卷:" << m_title << "" << questionCount << u8"道题";
    return true;
}



QJsonObject ExamPaper::toJson() const
{
    QJsonObject paperJson;
    paperJson.insert("title",m_title);
    // 添加总分和得分字段，确保字段存在
    paperJson.insert("totalScore", 0); // 默认为0分
    paperJson.insert("score", 0);     // 默认为0分
    paperJson.insert("studentName",m_studentName);
    paperJson.insert("studentCode",m_studentCode);

    // 添加元数据
    paperJson.insert("exportTime", QDateTime::currentDateTime().toString(Qt::ISODate));
    paperJson.insert("version", "1.0");

    // 保持与导入结构一致的嵌套格式
    QJsonArray moduleList;
    QJsonObject moduleObj;
    // 可以添加模块信息
    // moduleObj.insert("title", "试卷模块");

    QJsonArray groupList;
    QJsonObject groupObj;
    // 可以添加题目组信息
    // groupObj.insert("title", "所有题目");

    QJsonArray questionList;
    for (Question *question : m_questions) {
        questionList.append(question->toJson());
    }

    groupObj.insert("questionList", questionList);
    groupList.append(groupObj);
    moduleObj.insert("groupList", groupList);
    moduleList.append(moduleObj);

    paperJson.insert("moduleList", moduleList);

    return paperJson;
}



void ExamPaper::saveAnswersToFile(const QString &filePath)
{
    // 先读取原始文件以保留所有原始字段
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning() << u8"无法打开文件进行读取: " << filePath;
        return;
    }

    QByteArray jsonData = file.readAll();
    file.close();

    QJsonDocument doc = QJsonDocument::fromJson(jsonData);
    if (doc.isNull()) {
        qWarning() << u8"文件不是有效的JSON格式: " << filePath;
        return;
    }

    QJsonObject root = doc.object();

    // 1. 更新试卷基本信息（保留原始字段的同时更新必要信息）
    root.insert("title", m_title);
    root.insert("studentName", m_studentName);
    root.insert("studentCode", m_studentCode);

    // 2. 保留其他可能存在的顶级字段（如考试时间、总分等）
    // 这些字段不会被覆盖，保持原样

    // 3. 更新答案逻辑
    if (root.contains("moduleList") && root.value("moduleList").isArray()) {
        QJsonArray moduleList = root.value("moduleList").toArray();
        for (int m = 0; m < moduleList.size(); ++m) {
            if (!moduleList[m].isObject()) continue;

            QJsonObject moduleObj = moduleList[m].toObject();

            // 保留模块的所有原始字段

            if (moduleObj.contains("groupList") && moduleObj.value("groupList").isArray()) {
                QJsonArray groupList = moduleObj.value("groupList").toArray();
                for (int g = 0; g < groupList.size(); ++g) {
                    if (!groupList[g].isObject()) continue;

                    QJsonObject groupObj = groupList[g].toObject();

                    // 保留题目组的所有原始字段

                    if (groupObj.contains("questionList") && groupObj.value("questionList").isArray()) {
                        QJsonArray questionList = groupObj.value("questionList").toArray();
                        for (int q = 0; q < questionList.size(); ++q) {
                            if (!questionList[q].isObject()) continue;

                            QJsonObject questionObj = questionList[q].toObject();
                            int id = questionObj.value("id").toInt();

                            for (Question *question : m_questions) {
                                if (question->id() == id) {
                                    // 保留题目的所有原始字段，只更新答案相关字段
                                    questionObj["studentAnswer"] = question->userAnswer();

                                    // 如果需要，也可以从问题对象中更新其他字段
                                    // 例如：更新用户得分等
                                    questionList[q] = questionObj;
                                    break;
                                }
                            }
                        }
                        groupObj["questionList"] = questionList;
                        groupList[g] = groupObj;
                    }
                }
                moduleObj["groupList"] = groupList;
                moduleList[m] = moduleObj;
            }
        }
        root["moduleList"] = moduleList;
    }

    // 4. 添加保存时间戳（可选）
    root.insert("saveTime", QDateTime::currentDateTime().toString(Qt::ISODate));

    // 以写入方式重新打开文件
    if (file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) {
        file.write(doc.toJson(QJsonDocument::Indented));
        file.close();
        qDebug() << u8"答案已成功保存到文件: " << filePath;
    } else {
        qWarning() << u8"无法打开文件进行写入: " << filePath;
    }
}



void ExamPaper::clearQuestions()
{
    // 先删除所有题目对象（只需删除一次，因为都是同一个对象的引用）
    qDeleteAll(m_questions);
    
    // 清空所有题目列表
    m_questions.clear();
    m_singleChoiceQuestions.clear();
    m_judgeQuestions.clear();
}



void ExamPaper::answersChanged()
{

}

